package com.ruoyi.basebill.service.impl.billIssue.helper;

import com.ruoyi.basebill.domain.*;
import com.ruoyi.basebill.mapper.WfzJtgzflMapper;
import com.ruoyi.basebill.service.IWfzGzffService;
import com.ruoyi.basebill.service.IWfzGzftService;
import com.ruoyi.basebill.service.IWfzGzjtService;
import com.ruoyi.basebill.service.exception.DataNullException;
import com.ruoyi.basebill.service.impl.WfzJtgzflServiceImpl;
import com.ruoyi.basebill.service.impl.billIssue.util.BillIssueUtil;
import com.ruoyi.basedata.domain.WfzBank;
import com.ruoyi.basedata.domain.WfzBankentry;
import com.ruoyi.basedata.domain.WfzBaseunit;
import com.ruoyi.basedata.domain.WfzPerson;
import com.ruoyi.basedata.mapper.WfzBankMapper;
import com.ruoyi.basedata.service.IWfzBankService;
import com.ruoyi.basedata.service.IWfzBaseunitService;
import com.ruoyi.basedata.service.impl.WfzPersonServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.pushEnum.BillEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @projectName: wfz
 * @package: com.ruoyi.basebill.service.impl.billIssue.helper
 * @className: GzjtHelper
 * @author: Eric
 * @description: TODO
 * @date: 2023/3/5 19:33
 * @version: 1.0
 */
@Component
public class GzjtHelper {
    @Autowired
    private WfzJtgzflMapper wfzJtgzflMapper;
    //单据下发工具类
    @Autowired
    private BillIssueUtil billIssueUtil;
    //工资发放服务层接口
    @Autowired
    private IWfzGzffService wfzGzffService;
    //工资分摊服务层接口
    @Autowired
    private IWfzGzftService wfzGzftService;
    //工资计提服务层接口
    @Autowired
    private IWfzGzjtService wfzGzjtService;

    //组织成本中心服务层接口
    @Autowired
    private IWfzBaseunitService wfzBaseunitService;

    //人员服务层接口
    @Autowired
    private WfzPersonServiceImpl wfzPersonService;

    //薪酬总表计提工资福利服务层接口
    @Autowired
    private WfzJtgzflServiceImpl wfzJtgzflService;

    @Autowired
    private IWfzBankService wfzBankService;

    @Autowired
    private WfzBankMapper wfzBankMapper;

    public void splitBill(WfzJtgzfl wfzJtgzfl, List<WfzJtgzflentry> wfzJtgzflentryList, ArrayList<WfzGzjt> gzjts) throws DataNullException {

        for (WfzJtgzflentry wfzJtgzflentry : wfzJtgzflentryList) {

            String fpersonnumber = wfzJtgzflentry.getFpersonnumber();

            //获取员工档案中的一级法人，将一级法人作为参数将分录划分开
            WfzPerson person = getPerson(fpersonnumber);

            if (person == null) {
                throw new DataNullException("未找到" + fpersonnumber + "员工数据");
            }
            String fsscompany = person.getFsscompany();
            String fsscost = person.getFsscost();
            String fcostcompany = person.getFcostcompany();
            String fgzffjrjg = person.getFgzffjrjg();

            WfzBaseunit unit = getUnitByGy(fsscompany);
            WfzBaseunit unitByGy = getUnitByGy(fsscost);
            WfzBaseunit compamyunitByGy1 = getUnitByGy(fcostcompany);

            if (unit == null) {
                throw new DataNullException("未找到" + fsscompany + "一级法人");
            }

            fsscompany = unit.getFnumber(); //eas编码
            fsscost = unitByGy.getFnumber(); //eas成本中心
            String fcostname = unitByGy.getFname(); //成本中心民称
            fcostcompany = compamyunitByGy1.getFnumber(); //成本中心所属财务组织
            String fcosttype = unitByGy.getFcosttype(); //成本中心属性
            String fpzz = unitByGy.getFpzz(); //凭证字

            String fbanknumber = getBankNumBycomany(fsscompany, BillEnum.GZ.toString(), fgzffjrjg);
            if(fbanknumber==null){
                throw new DataNullException("没有"+fgzffjrjg+"的银行数据");
            }
            WfzGzjt gzjtByCompany = judIsBill(fsscompany, gzjts);//判断是否含有同一张单据,拿到相同组织的工资发放
            if (gzjtByCompany!=null) {
                //查看是否融合 ,以成本中心和银行为维度进行融合
                List<WfzGzjtentry> wfzGzjtentryList = gzjtByCompany.getWfzGzjtentryList();
                Boolean flag = false;
                for (WfzGzjtentry wfzGzjtentry : wfzGzjtentryList) {
                    String fyhzh = wfzGzjtentry.getFyhzh();
                    String fcostnumber = wfzGzjtentry.getFcostnumber();
                    if (fbanknumber.equals(fyhzh) && fsscost.equals(fcostnumber)) {
                        //融合
                        mergeGzff(wfzGzjtentry,wfzJtgzflentry);
                        flag = true;
                        gzjtByCompany.setFzrs(gzjtByCompany.getFzrs().add(BigDecimal.ONE)); //总人数
                        break;
                    }
                }
                if (Boolean.TRUE.equals(flag)) {
                    continue;
                }
                // 未融合的单据则新增一条分录
                //新增一张单据//判断结算方式
                String jsfs = billIssueUtil.Jsfs(fsscompany, fsscost);//组织间结算方式
                //如果不存在新建一个工资发放队
                //拼接分录
                WfzGzjtentry wfzGzjtentry = new WfzGzjtentry(); //
                addGzffEntry(wfzJtgzflentry,wfzGzjtentry,fsscompany,fsscost,fcostname,fcostcompany,fcosttype,fpzz,fgzffjrjg,fbanknumber);
                if ("同组织下合并纳税成本中心".equals(jsfs)){
                    gzjtByCompany.setFnscbzxrs(gzjtByCompany.getFnscbzxrs().add(BigDecimal.ONE));
                }
                if ("同组织下是二级组织".equals(jsfs) || "非同组织".equals(jsfs)){
                    gzjtByCompany.setFglf(gzjtByCompany.getFglf().add(BigDecimal.ONE));
                }
                gzjtByCompany.getWfzGzjtentryList().add(wfzGzjtentry);
                int size = gzjtByCompany.getWfzGzjtentryList().size();
                gzjtByCompany.setFzrs(BigDecimal.valueOf(size)); //总人数
            } else {
                //新增一张单据
                //判断结算方式
                String jsfs = billIssueUtil.Jsfs(fsscompany, fsscost);//组织间结算方式
                //如果不存在新建一个工资发放队
                WfzGzjt wfzGzjt = new WfzGzjt();
                billIssueUtil.setBillNumber(wfzGzjt);
                wfzGzjt.setFperiod(wfzJtgzfl.getFperiod());
                wfzGzjt.setFzrs(BigDecimal.ONE);
                if ("同组织下合并纳税成本中心".equals(jsfs)){
                    wfzGzjt.setFnscbzxrs(BigDecimal.ONE);
                }
                if ("同组织下是二级组织".equals(jsfs) || "非同组织".equals(jsfs)){
                    wfzGzjt.setFglf(BigDecimal.ONE);
                }
                wfzGzjt.setFcreator("admin");
                wfzGzjt.setFcreatetime(new Date());
                wfzGzjt.setFcompany(fsscompany);
                WfzGzjtentry wfzGzjtentry = new WfzGzjtentry(); //
                //拼接分录
                addGzffEntry(wfzJtgzflentry,wfzGzjtentry,fsscompany,fsscost,fcostname,fcostcompany,fcosttype,fpzz,fgzffjrjg,fbanknumber);
                //根据
                ArrayList<WfzGzjtentry> wfzGzjtentries = new ArrayList<>();
                wfzGzjtentries.add(wfzGzjtentry);
                //根据
                wfzGzjt.setWfzGzjtentryList(wfzGzjtentries);
                gzjts.add(wfzGzjt);
            }
        }
    }

    public WfzGzjt judIsBill(String fssCompany,ArrayList<WfzGzjt> gzjts){
        WfzGzjt wfzGzjt = null;
        for (WfzGzjt gzft : gzjts) {
            String fcompany = gzft.getFcompany();
            if(fssCompany.equals(fcompany)){
                wfzGzjt =gzft;
                break;
            }
        }
        return  wfzGzjt;
    }

    /**
     * @// TODO: 2023/3/4 相同条件融合
     * @param wfzGzjtentry 工资计提分录
     * @param wfzJtgzflentry 薪酬总表分录
     */
    public void mergeGzff(WfzGzjtentry wfzGzjtentry,WfzJtgzflentry wfzJtgzflentry ){
        wfzGzjtentry.setFyfgz(wfzGzjtentry.getFyfgz().add(wfzJtgzflentry.getFtzhje())); //应发工资

    }
    /**
     * @// TODO: 2023/3/4 新增一条工资发放分录
     * @param wfzJtgzflentry 薪酬总表分录
     * @param fsscompany 一级法人
     * @param fsscost 成本中心
     * @param fcostname 成本中心名称
     * @param fcostcompany 成本中心所属财务组织
     * @param fcosttype 成本中心属性
     * @param fpzz 凭证字
     * @param fgzffjrjg 工资计提
     * @param fbanknumber 银行账号
     */
    public void addGzffEntry(WfzJtgzflentry wfzJtgzflentry,WfzGzjtentry wfzGzjtentry,String fsscompany,String fsscost,String fcostname,String fcostcompany,String fcosttype,String fpzz,String fgzffjrjg, String fbanknumber){

        String jsfs = billIssueUtil.Jsfs(fsscompany, fsscost);//组织间结算方式
        //如果不存在新建一个工资发放队
        //拼接分录
        wfzGzjtentry.setFyfgz(wfzJtgzflentry.getFtzhje()); //应发工资

        wfzGzjtentry.setFcostname(fcostname);
        wfzGzjtentry.setFcostnumber(fsscost);
        wfzGzjtentry.setFcostcompany(fcostcompany); //c成本中心所属财务组织
        wfzGzjtentry.setFjsfs(jsfs);  //结算方式

        wfzGzjtentry.setFcbzxxz(fcosttype); //成本中心属性
        wfzGzjtentry.setFvourtype(fpzz); //凭证字

        wfzGzjtentry.setFcbzxxz(fgzffjrjg); //金融机构
        wfzGzjtentry.setFyhzh(fbanknumber); //银行账号
    }


    public WfzPerson getPerson(String personCode){
        WfzPerson wfzPerson = new WfzPerson();
        WfzPerson person = null;
        wfzPerson.setFnumber(personCode);
        List<WfzPerson> wfzPeople = wfzPersonService.selectWfzPersonList(wfzPerson);
        if (wfzPeople.size() > 0){
            person = wfzPeople.get(0);
        }

        return person;
    }

    /**
     * todo 通过盖雅编码还原EAS编码
     * @param unitCode 盖雅编码
     * @return
     *
     */
    public WfzBaseunit getUnitByGy(String unitCode){

        WfzBaseunit wfzBaseunit = new WfzBaseunit();
        wfzBaseunit.setFgynumber(unitCode);
        WfzBaseunit baseunit = null;
        List<WfzBaseunit> wfzBaseunits = wfzBaseunitService.selectWfzBaseunitList(wfzBaseunit);
        if (wfzBaseunits.size()>0){
            baseunit = wfzBaseunits.get(0);
        }
        return baseunit;
    }


    /**
     * @// TODO: 2023/3/4 根据金融机构和财务组织获取工资银行账号
     * @param fsscompany
     * @return
     */
    public String getBankNumBycomany(String fsscompany,String BillType,String fgzffjrjg){
        WfzBank wfzBank = new WfzBank();
        String fbanknumber = null;
        wfzBank.setFcompanynumber(fsscompany);
        wfzBank.setFtype(BillType);
        List<WfzBank> wfzBanks = wfzBankService.selectWfzBankList(wfzBank);
        if(wfzBanks.size()>0){
            WfzBank bank = wfzBanks.get(0);
            List<WfzBankentry> wfzBankentries = wfzBankMapper.selectBankEntry(wfzBanks.get(0).getFid(), fgzffjrjg);
            if(wfzBankentries.size()>=0){
                WfzBankentry wfzBankentry = wfzBankentries.get(0);
                fbanknumber = wfzBankentry.getFbanknumber();
            }
        }
        return fbanknumber;
    }
}
